/* 将 (a1, a2, a3 ... am, b1, b2, b3 ... bn) 转换成 (b1, b2, b3 ... bn, a1, a2, a3 ... am) */

#include <iostream>
using namespace std;

// 逆序操作
void Reverse(int A[], int m, int n)
{
  // 中间元素索引
  int mid = (m + n) / 2;
  
  // 两个指针分别指向首尾，进行值交换
  for (int i = m, j = 0; i <= mid; ++i, ++j)
  {
    int temp = A[i];
    A[i] = A[n - j];
    A[n - j] = temp;
  }
}

// 分组交换
void change(int A[], int m, int n)
{
  // 整个数组逆序
  Reverse(A, 0, m + n - 1);
  
  // 前n个元素逆序
  Reverse(A, 0, n - 1);
  
  // 后m个元素逆序
  Reverse(A, n, m + n - 1);
}

int main()
{
  // 创建数组
  int A[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  
  // 分组交换
  change(A, 3, 7);
  
  // 打印
  for (int i = 0; i < 10; ++i)
  {
    cout << A[i] << " ";
  }
}